/**
 * @file Condition.hpp
 * @brief 条件变量封装类的声明
 * @details 封装了pthread_cond，用于线程间同步
 */

#ifndef __Condition_H__
#define __Condition_H__

#include "Noncopyable.hpp"
#include <pthread.h>

namespace wd
{

/**
 * @class MutexLock
 * @brief 互斥锁类的前向声明
 * @details 避免头文件循环依赖
 */
class MutexLock;

/**
 * @class Condition
 * @brief 条件变量类
 * @details 封装pthread_cond_t，不可复制，需要配合MutexLock使用
 */
class Condition : Noncopyable
{
public:
    /**
     * @brief 构造函数
     * @param m MutexLock引用，关联的互斥锁
     */
    Condition(MutexLock & m);
    ~Condition();

    /**
     * @brief 等待条件变量
     * @details 阻塞当前线程，直到被notify或notifyAll唤醒
     */
    void wait();
    
    /**
     * @brief 唤醒一个等待线程
     */
    void notify();
    
    /**
     * @brief 唤醒所有等待线程
     */
    void notifyAll();

private:
    pthread_cond_t _cond;    ///< 条件变量
    MutexLock &    _mutex;   ///< 关联的互斥锁引用
};                        //引用在使用时，无法获取引用本身的地址空间

}//end of namespace wd


#endif

